home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Performance Co-Pilot 1.3
/
SGI Performance Co-Pilot 1.3.iso
/
dist
/
pcp_gifts.idb
/
usr
/
sbin
/
dkmap.z
/
dkmap
Wrap
Text File
|
1997-04-03
|
9KB
|
414 lines
#!/bin/sh
#
# Produce a map of disk real estate usage
#
# $Header: /isms/npcp/pcp/1.3/gifts/dkmap/RCS/dkmap.sh,v 2.2 1997/03/21 07:06:04 kenmcd Exp $
#
# todo:
# - nested volume manager definitions?
# - other dbms products
# - partition overlap/containment?
# - identification of unuseable space (not in any partition)
# ... can this happen?
#
status=0
trap "rm -f /tmp/$$*; exit \$status" 0 1 2 3 15
prog=`basename $0`
sflag=false
oflag=false
DEBUG=false
PATH=$PATH:/etc:/usr/local/bin ; export PATH
while [ $# -gt 0 ]
do
case $1
in
-s)
# get disks from sar instead of hinv
sflag=true
;;
-o) # include Oracle disk information
oflag=true
;;
-d) # DEBUG
DEBUG=true
;;
*)
echo "Usage: dkmap [options]"
echo ""
echo "Options"
echo " -d turn debug on .. see _lvol and _map.* files"
echo " -s get disks from sar, not hinv"
echo " -o include information for Oracle disks"
exit 1
;;
esac
shift
done
id=`id | sed -e 's/(.*//' -e 's/.*=//'`
if [ $id != 0 ]
then
echo "$prog: must be run as root"
exit 1
fi
if $sflag
then
#
# get list of disks that are alive from sar
#
sar -d 1 1 \
| sed -e '1,4d' \
-e 's/^.........//' \
-e 's/^ *//' \
-e 's/ .*//'
else
#
# construct list of disks from hinv
#
hinv \
| sed -e 's/://g' -e 's/, lun/ lun/' \
| nawk '
/Disk drive .* on SCSI .* RAID/{ printf "rad%sd%s\n",$8,$4; next }
/Disk drive .* lun .* on SCSI / { printf "dks%sd%sl%s\n",$10,$4,$6; next }
/Disk drive .* on SCSI / { printf "dks%sd%s\n",$8,$4; next }
/Disk drive .* on VME-SCSI / { printf "jag%sd%s\n",$8,$4; next }'
fi >/tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.0
if [ -s /tmp/$$.map ]
then
:
else
echo "$prog: could find any disks?"
status=1
exit
fi
#
# use prtvtoc to get partiton table for each disk
#
lastdnum=x
i=0
rm -f /tmp/$$_*
for dk in `sort -td +2 -3 /tmp/$$.map`
do
dnum=`echo $dk | sed -e 's/.*d//'`
if [ $dnum != $lastdnum ]
then
if [ $i -gt 0 ]
then
wait
cat /tmp/$$_* >>/tmp/$$
rm -f /tmp/$$_*
i=0
fi
lastdnum=$dnum
fi
if /usr/pcp/bin/dkping /dev/rdsk/${dk}vh >/dev/null 2>&1
then
( prtvtoc /dev/rdsk/${dk}vh \
| sed -e '1,/^Partition/d' \
-e '/volhdr/d' \
-e '/volume/d' \
-e 's/[()]/ /g' \
| nawk '
NF==6 { print "'$dk's" $1,$2,$3,$3+$5-1 }
NF==8 { print "'$dk's" $1,$2,$4,$4+$6-1,$8 }' \
>/tmp/$$_$i ) &
i=`expr $i + 1`
else
echo "$prog: Warning: no response from /dev/rdsk/${dk}, will be skipped"
fi
done
if [ $i -gt 0 ]
then
wait
cat /tmp/$$_* >>/tmp/$$
rm -f /tmp/$$_*
fi
sort /tmp/$$ >/tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.1
#
# find the mounted file systems
# - this is more accurate/recent than prtvtoc ...
#
mount \
| egrep 'type efs|type xfs' \
| sed -e 's,/dev/dsk/,,' \
-e 's/ on / /' \
-e 's/ type \([^ ]*\) .*/ \1/' \
| sort >/tmp/$$.mount
join -a1 -o 1.1 1.2 1.3 1.4 1.5 2.2 1.6 2.3 /tmp/$$.map /tmp/$$.mount \
| nawk '
NF <= 5 { print; next }
NF == 6 { print $1,$6,$3,$4,$5; next }
NF == 7 { print $1,$7,$3,$4,$6; next }' >/tmp/$$
sort +0 -1 /tmp/$$ >/tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.4
#
# find and match up swap partitions
#
ls -l /dev/rdsk | grep "`ls -l /dev/rswap | nawk '{ print $5 \" *\" $6 }'`" \
| nawk '{ print $NF}' >/tmp/$$
swap -l \
| sed -e 1d -e "s,/dev/swap,`cat /tmp/$$`," \
| nawk '{ print $2,"swap" }' \
| sort >/tmp/$$.swap
join -a1 /tmp/$$.map /tmp/$$.swap >/tmp/$$
mv /tmp/$$ /tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.2
#
# expand any volume manager volumes into their constituent pieces and
# match this up
#
touch /tmp/$$.lvol
lvinfo \
| sed -e '/^#/d' \
-e '/^ *$/d' \
-e '/\\$/{
: loop
N
s/\\\n//
t loop
}' \
-e 's/,[ ]*/ /g' \
-e 's,/dev/dsk/,,g' \
-e 's/:.*devs= */ /' \
| nawk '{ for (i=2; i<=NF; i++) print $i " " $1 " (part-" i-2 ")" }' >>/tmp/$$.lvol
#
# xlv volumes ...
#
if [ -d /dev/rdsk/xlv ]
then
for vol in `ls /dev/rdsk/xlv`
do
# I know this is hard to believe, but this is the interface we have
# to work with!
#
echo '42
'$vol'
99' \
| xlv_admin 2>/dev/null \
| nawk '
BEGIN { p = 0 }
state == 1 && NF == 0 { exit }
/blks\)/ { state = 1
print $1 " '$vol' (part-" p ")"
p++
}' \
| sed -e 's;/dev/dsk/;;' >>/tmp/$$.lvol
done
fi
sort -o /tmp/$$.lvol /tmp/$$.lvol
$DEBUG && cp /tmp/$$.lvol _lvol
join -a1 -o 1.1 1.2 2.2 1.3 1.4 1.5 2.3 /tmp/$$.map /tmp/$$.lvol \
| nawk '
$NF ~ /^\(part-/ { print $1,$3,$4,$5,$6,$7; next }
$2 == "lvol" { print $0," (!config)"; next }
$2 == "xlv" { print $0," (!config)"; next }
{ print }' >/tmp/$$
sort +1 -2 /tmp/$$ >/tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.3
#
# find the mounted file systems for the logical volumes
#
mount \
| egrep 'lv|xlv' \
| sed -e 's,/dev/dsk/,,' \
-e 's,^xlv/,,' \
-e 's/ on / /' \
-e 's/ type.*//' \
| sort >/tmp/$$.mount
join -j1 2 -a1 -o 1.1 1.2 1.3 1.4 1.5 2.2 1.6 /tmp/$$.map /tmp/$$.mount >/tmp/$$
sort +0 -1 /tmp/$$ >/tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.5
if [ "X$ORACLE_HOME" != X -a "X$ORACLE_SID" != X ]
then
#
# dredge in Oracle
#
# oracle sys account [defaults - may have to be changed]
ora_sys=sys
ora_pw=change_on_install
PATH=$PATH:$ORACLE_HOME/bin ; export PATH
cat >/tmp/$$.sh <<End-of-File
sqlplus <<'End-of-SQL'
$ora_sys/$ora_pw
set pagesize 9999
set linesize 9999
select substr(tablespace_name,1,28) "Tablespace", substr(file_name,1,50) "File"
from dba_data_files;
select substr(member,1,50) "Log File", group#
from v\$logfile;
End-of-SQL
End-of-File
if $oflag
then
#
# only oradev can run sqlplus!
#
su oradev -c "sh /tmp/$$.sh" >/tmp/$$.sql
status=$?
else
#
# sane state
#
sh /tmp/$$.sh >/tmp/$$.sql
status=$?
fi
$DEBUG && cp /tmp/$$.sh _sh
$DEBUG && cp /tmp/$$.sql _sql
[ $status != 0 ] && echo "$prog: Warning: exit status $status from Oracle's SQLPLUS"
rm -f /tmp/$$.err
sed </tmp/$$.sql \
-e '1,/^-----/d' \
-e '/Disconnected from ORACLE/,$d' \
-e '/^SQL> /d' \
-e '/^[ ]*$/d' \
-e '/Tablespace/d' \
-e '/^----/d' \
-e '/rows selected/d' \
-e 's/^[ ]*//' \
-e 's/[ ][ ]*/ /g' \
| nawk '
/ERROR/ { print "_E_R_R_O_R_",$0; exit }
/Log File/ { state = 1; next }
state == 0 { print; next }
state == 1 { print "TXLOG." $2,$1 }' \
| while read tblespace dev
do
if [ "$tblespace" = "_E_R_R_O_R_" ]
then
cat /tmp/$$.sql >/tmp/$$.err
echo "$prog: Oracle SQLPLUS error ... sorry" >>/tmp/$$.err
break
fi
slink=true
while $slink
do
if [ -l $dev ]
then
dev=`ls -ld $dev | sed -e 's/.* -> //'`
else
slink=false
if [ -f $dev ]
then
type=file
elif [ -c $dev ]
then
type=raw
else
type=unknown
fi
fi
done
case $dev
in
/dev/rdsk/lv*)
lv=`echo $dev | sed -e 's,/dev/rdsk/,,'`
grep " $lv " /tmp/$$.lvol >/tmp/$$
if [ -s /tmp/$$ ]
then
sed </tmp/$$ \
-e "s/ / raw /" \
-e "s/^/$tblespace /"
else
echo "$prog: lv botch, cannot find specification for $dev" >/tmp/$$.err
break
fi
;;
*)
echo $tblespace $dev $type
;;
esac
done \
| sed -e 's,/dev/rdsk/,,' \
| nawk '
$3 == "raw" { if (NF == 5)
printf "%s Oracle['$ORACLE_SID'] %s %s %s\n",$2,$1,$4,$5
else
printf "%s Oracle['$ORACLE_SID'] %s\n",$2,$1
}' \
| sort +0 -1 >/tmp/$$.ora
$DEBUG && cp /tmp/$$.ora _ora
if [ -f /tmp/$$.err ]
then
cat /tmp/$$.err
status=1
exit
fi
join -a1 -o 1.1 1.2 1.3 1.4 1.5 1.6 2.2 2.3 /tmp/$$.map /tmp/$$.ora >/tmp/$$
sort +0 -1 /tmp/$$ >/tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.6
fi
#
# heuristic to remove partitions from vtoc that are not used and
# overlap partitions that are used
#
sed </tmp/$$.map \
-e 's/\([0-9]\)s\([0-9]\)/\1 s\2/' \
| sort +0 -1 +3n -4 +6r \
| nawk '
$1 != dk || $4 != start { if ($1 != dk || $4 > end) {
dk = $1; start = $4; end = $5; used = 0
}
}
NF >= 6 { used = 1 }
NF == 5 && used == 1 { next }
{ print }' \
| sed -e 's/ s/s/' \
| sort +0 -1 -o /tmp/$$.map
$DEBUG && cp /tmp/$$.map _map.7
#
# summary report
#
echo "dkmap for `/usr/bsd/hostname` on `date`"
echo ""
sort +0 -1 +2n -3 +3n -4 /tmp/$$.map \
| sed \
-e 's/\([^ ]*[0-9][0-9]*d[0-9][0-9]*\)s/\1 &/' \
-e '/lvol/s/!config/lv not configured/' \
-e '/xlv/s/!config/xlv not configured/' \
| nawk '
BEGIN { print "Partition Type or lv Start Blk End Blk Size(Mb) Use" }
{ if ($1 != last && last != "") print ""
last = $1
type = $3
if ($6 == "swap") type = "swap"
else if ($6 ~ /^Oracle/) type = "ora"
if ($1 ~ /^rad/) type = "raid"
printf "%-12s %10s %9d %9d %9d %s %s %s\n",$2,type,$4,$5,int(0.5+($5+1-$4)/2048),$6,$7,$8
}'
exit